等价于求字符串的最长公共前缀。
1 2 3 4 5 6 7 8 9 10
| class Solution { public int findMinimumOperations(String s1, String s2, String s3) { int n = Math.min(s1.length(), Math.min(s2.length(), s3.length())); int i = 0; while (i < n && s1.charAt(i) == s2.charAt(i) && s2.charAt(i) == s3.charAt(i)) { i++; } return i == 0 ? -1 : s1.length() + s2.length() + s3.length() - 3 * i; } }
|
将每个 \(1\) 右边 \(0\) 的个数累加就是需要交换的次数,或者累加每个 \(0\) 左边 \(1\) 的个数也行。
1 2 3 4 5 6 7 8 9 10 11
| class Solution { public long minimumSteps(String s) { long ans = 0L; int n = s.length(), cnt = 0; for (int i = n - 1; i >= 0; i--) { if (s.charAt(i) == '0') cnt++; else ans += cnt; } return ans; } }
|
要求 \(\max((a\oplus x)\times(b\oplus x))\),可以得出异或只会在两者都为 \(0\) 的位上补 \(1\),或者交换两者某位上的 \(0\) 和 \(1\)。此时 \((a\oplus x)+(b\oplus x)=c\),\(c\) 为某个定值,从而问题可以转化为求函数 \(y=x(c-x)\) 的最大值,可以知道当 \(x=\frac{c}{2}\) 时取到最大值,即我们需要让 \((a\oplus x)\) 和 \((b\oplus x)\) 尽可能相等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { private static final int MOD = (int) 1e9 + 7; public int maximumXorProduct(long a, long b, int n) { long p = a >> n << n, q = b >> n << n; for (int i = n - 1; i >= 0; i--) { if ((a >> i & 1) == (b >> i & 1)) { p |= 1L << i; q |= 1L << i; } else if (p < q) { p |= 1L << i; } else { q |= 1L << i; } } return (int) (p % MOD * (q % MOD) % MOD); } }
|
离线查询,可以预处理查询序列,然后使用单调栈 + 二分,或者使用最小堆;在线查询,可以使用线段树(暂时不学)。